---
title: Go 語言介紹
---

## Go 語言歷史與設計哲學

Go（也稱為 Golang）是由 Google 的 Robert Griesemer、Rob Pike 和 Ken Thompson 設計的靜態類型編譯型程式語言。它創建於 2007 年，並於 2009 年正式發布。Go 的設計目的是解決現代軟體開發中的挑戰，特別是在大規模分散式系統和雲端運算環境中。

Go 的設計哲學強調：
- **簡潔性**：乾淨、可讀的語法，關鍵字最少
- **並發性**：內建對並發程式設計的支援，透過 goroutines 和 channels
- **效能**：快速編譯和高效執行
- **安全性**：強類型系統和記憶體安全，無需垃圾回收開銷
- **生產力**：快速開發週期，內建工具和測試

## 與 JavaScript 的概覽對比

| 特性             | JavaScript                               | Go                                      |
| :--------------- | :--------------------------------------- | :--------------------------------------- |
| **程式設計範式** | 多範式（函數式、物件導向、事件驅動）     | 多範式（程序式、並發、物件導向）         |
| **類型系統**     | 動態類型，弱類型                         | 靜態類型，強類型                         |
| **執行方式**     | 解釋執行（瀏覽器/Node.js 中 JIT 編譯）   | 編譯執行                                 |
| **記憶體管理**   | 自動（垃圾回收）                         | 自動（垃圾回收）                         |
| **並發處理**     | 事件驅動，async/await，Promises          | 內建 goroutines 和 channels              |
| **效能**         | 相對較慢（解釋執行/GC）                  | 快速（編譯執行，高效 GC）                |
| **應用場景**     | Web 開發、行動應用、桌面應用             | 系統程式設計、微服務、雲原生、Web 服務   |

## 編譯型 vs 解釋型語言

**JavaScript（解釋型/JIT 編譯）：**
JavaScript 程式碼通常由解釋器執行（如瀏覽器的 JavaScript 引擎或 Node.js）。雖然現代 JavaScript 引擎使用即時（JIT）編譯在執行時將程式碼轉換為機器碼以提高效能，但其核心特徵是程式碼不會預先編譯成獨立的可執行檔案。

**Go（編譯型）：**
Go 程式碼必須在執行前編譯成機器碼。這個過程包括：
1. **解析**：Go 編譯器將原始碼解析為抽象語法樹（AST）
2. **類型檢查**：靜態類型分析和語義驗證
3. **編譯**：將 Go 程式碼轉換為機器碼
4. **連結**：將編譯後的程式碼和依賴項組合成單個可執行檔案

Go 的編譯速度極快，即使對於大型專案也只需要幾秒鐘，這使得它在開發速度方面感覺更像解釋型語言。

## Go 應用場景和優勢

**應用場景：**
* **微服務**：高效能、可擴展的微服務架構
* **雲原生開發**：Kubernetes、Docker 和雲端平台開發
* **Web 服務**：RESTful API、GraphQL 服務和 Web 應用
* **系統程式設計**：網路服務、系統工具和實用程式
* **DevOps 工具**：CI/CD 流水線、監控工具和自動化腳本
* **高效能運算**：並發資料處理和即時系統

**優勢：**
* **並發性**：內建 goroutines 和 channels，便於並發程式設計
* **效能**：快速編譯和高效執行
* **簡潔性**：乾淨的語法和最小的學習曲線
* **標準庫**：豐富的標準庫，包含網路、HTTP 和測試功能
* **跨平台**：單一二進制檔案部署到不同平台
* **工具鏈**：優秀的內建工具（go fmt、go test、go mod 等）
* **雲原生**：專為現代雲端和容器環境設計

## 開發環境設定

要編寫和執行 Go 程式碼，你需要：

1. **Go 安裝**：從官方網站下載並安裝 Go
2. **文字編輯器或 IDE**：Visual Studio Code、GoLand、Vim 或任何支援 Go 的文字編輯器
3. **Go 模組**：現代依賴管理（Go 1.11+）

**安裝說明：**

```bash
# 從 https://golang.org/dl/ 下載 Go
# macOS（使用 Homebrew）
brew install go

# Ubuntu/Debian
sudo apt update
sudo apt install golang-go

# Windows
# 從 golang.org/dl/ 下載 MSI 安裝程式
```

**驗證安裝：**
```bash
go version
# 應該輸出：go version go1.21.x darwin/amd64（或類似）
```

**設定 Go 工作空間：**
```bash
# 為你的 Go 專案建立目錄
mkdir ~/go
cd ~/go

# 初始化新模組
go mod init myproject
```

## 你的第一個 Go 程式

讓我們編寫一個簡單的 "Hello, World!" Go 程式。

<UniversalEditor title="Hello World 對比" compare={true}>
```javascript !! js
// JavaScript: Hello World
console.log("Hello, World from JavaScript!");
```

```go !! go
// Go: Hello World
package main // 每個可執行的 Go 程式都必須有一個 main 包

import "fmt" // 匯入 fmt 包用於格式化 I/O

func main() { // main 函數：程式的進入點
    fmt.Println("Hello, World from Go!") // 列印到控制台
}
```
</UniversalEditor>

## 編譯和執行過程

要編譯和執行 Go "Hello, World!" 程式（假設你將其儲存為 `hello.go`）：

1. **直接執行（開發推薦）：**
    ```bash
    go run hello.go
    ```
    這一步編譯並執行程式，非常適合開發。

2. **建置可執行檔案：**
    ```bash
    go build hello.go
    ```
    這會建立一個名為 `hello` 的可執行檔案（Windows 上為 `hello.exe`）。

3. **執行可執行檔案：**
    ```bash
    ./hello  # Unix 類系統
    hello.exe  # Windows
    ```

## Go 模組系統

Go 使用模組進行依賴管理。以下是設定新專案的方法：

```bash
# 為你的專案建立新目錄
mkdir my-go-project
cd my-go-project

# 初始化新模組
go mod init my-go-project

# 這會建立一個追蹤依賴項的 go.mod 檔案
```

**go.mod 檔案範例：**
```go
module my-go-project

go 1.21

require (
    github.com/gin-gonic/gin v1.9.1
    github.com/go-sql-driver/mysql v1.7.1
)
```
後續我們將更深入介紹 Go 的模組系統以及 Go 的套件管理。
## Go 工具鏈

Go 提供了優秀的內建工具：

- **`go run`**：編譯並執行 Go 程式
- **`go build`**：將 Go 程式編譯為可執行檔案
- **`go test`**：執行測試
- **`go fmt`**：格式化 Go 程式碼
- **`go mod`**：管理依賴項
- **`go get`**：下載並安裝包
- **`go vet`**：分析程式碼中的潛在問題
- **`go doc`**：產生文件

## JavaScript 開發者需要了解的關鍵 Go 概念

**1. 包和匯入：**
```go
package main // 宣告包

import (
    "fmt"     // 標準庫包
    "strings" // 另一個標準庫包
)
```

**2. 函數：**
```go
func add(a, b int) int {
    return a + b
}
```

**3. 變數和類型：**
```go
var name string = "Go"
age := 25 // 短變數宣告（類型推斷）
```

**4. 並發（Go 的超能力）：**
```go
go func() {
    // 這會並發執行
    fmt.Println("在 goroutine 中執行")
}()
```

---

### 練習題：
1. Go 和 JavaScript 在執行模型方面的主要區別是什麼？
2. 列出 Go 比 JavaScript 更優選的三個常見應用領域，並解釋原因。
3. 描述設定 Go 開發環境涉及的步驟。
4. `go run` 和 `go build` 之間有什麼區別？

### 專案想法：
* 在 Go 中建立一個簡單的 HTTP 伺服器，提供 "Hello, World!" 訊息，並與 Node.js 等效版本進行比較。

### 下一步：
* 學習 Go 的語法以及它與 JavaScript 的比較
* 理解 Go 的類型系統和介面
* 探索 Go 強大的並發特性：goroutines 和 channels
